#include <omp.h>
#include <stdlib.h>
#include <iostream>

// 初始化函数（CPU版本）
void init(float *v1, float *v2, int N)
{
#pragma omp parallel for
    for (int i = 0; i < N; i++)
    {
        v1[i] = 1.0f; // 示例初始化逻辑
        v2[i] = 2.0f;
    }
}

void foo()
{
// 模拟异步任务（例如日志输出）
#pragma omp task
    std::cout << "Async task: Other work...\n";
}

void output(float *p, int N)
{
    std::cout << "First 5 results: ";
    for (int i = 0; i < 5; i++)
        std::cout << p[i] << " ";
    std::cout << "\n";
}

void vec_mult(float *p, int N)
{ // 移除dev参数
    float *v1, *v2;
    v1 = (float *)malloc(N * sizeof(float));
    v2 = (float *)malloc(N * sizeof(float));

#pragma omp task shared(v1, v2) depend(out : v1, v2)
    {
        init(v1, v2, N); // 直接在CPU上初始化
    }

    foo(); // 异步执行其他任务

#pragma omp task shared(v1, v2, p) depend(in : v1, v2)
    {
#pragma omp parallel for
        for (int i = 0; i < N; i++)
            p[i] = v1[i] + v2[i];
    }
#pragma omp taskwait

    free(v1);
    free(v2);
    output(p, N);
}

int main()
{
    const int N = 100;
    float p[N];
    vec_mult(p, N);
    return 0;
}